import { getDataValueByKey } from '@/utils'
import merge from '@/utils/merge'
import { registerGloablComponents } from './components/index.js'
import Vue from 'vue'

class WkGlobal {
  constructor(props) {
    this.global = {}// 存各模块 common 文件夹下的数据
    this.config = merge({
      store: {},
      router: null
    }, props || {})
    // 初始化载入公共数据
    this.init()
    // 注册公共组件
    registerGloablComponents(this.global)
  }

  init() {
    // 填充个模块数据
    // 获取所有模块目录下的 common/meta.js 文件
    const metaContext = require.context('@/views', true, /\/[^/]+\/common\/meta\.js$/)
    // 导入所有 common/utils.js 文件
    metaContext.keys().forEach(path => {
      const keyData = metaContext(path).default
      this.global[keyData.module] = {
        meta: keyData
      }
    })

    // 获取所有模块目录下的 api.js components.js utils.js  文件
    const apiContext = require.context('@/views', true, /\/[^/]+\/common\/api\.js$/)
    const componentsContext = require.context('@/views', true, /\/[^/]+\/common\/components\.js$/)
    const utilsContext = require.context('@/views', true, /\/[^/]+\/common\/utils\.js$/)

    const otherContext = [{
      context: apiContext,
      property: 'api'
    }, {
      context: componentsContext,
      property: 'components'
    }, {
      context: utilsContext,
      property: 'utils'
    }]

    otherContext.forEach(({ context, property }) => {
      context.keys().forEach(path => {
        const moduleKey = Object.keys(this.global).find(globalKey => {
          const globalModule = this.global[globalKey]
          return path.startsWith(`./${globalModule.meta.dirName}`)
        })
        if (moduleKey) {
          const keyData = context(path).default
          this.global[moduleKey][property] = keyData
        }
      })
    })
  }

  // 增加方法
  // 增加读取配置的方法
  get(key) {
    if (!key) {
      console.warn('key 必传')
      return
    }
    const keyValue = getDataValueByKey(this.global, key)
    // 不是undefined时，返回获取到的值
    if (keyValue !== undefined) {
      return keyValue
    } else {
      // 没有获取到时，基于默认值
      const keyType = key.split('.')[1]
      if (keyType === 'components') {
        return () => {}
      } else if (keyType === 'utils') {
        return {}
      }
    }
  }

  /**
   * @description: 获取有效模块
   * @param {*} systemData // 包含 auth 权限对象 和 moduleAuth 模块开启对象 store
   * @param {*} key
   * @return {*}
   */
  getModules(systemData, key) {
    if (key) {
      return this.global[key]
    }

    const modules = []
    Object.keys(this.global).forEach(key => {
    // 忽略无效键值
      const module = this.global[key]
      if (typeof module !== 'function' && !module.meta.ignore) {
        // meta 数据完善
        if (module.meta?.getPath) {
          module.meta.path = module.meta.getPath({
            store: this.config.store
          })
        }

        // meta 权限判断
        if (module.meta?.getAuth) {
          if (module.meta.getAuth(systemData)) {
            modules.push(module)
          }
        } else { // 没有配置 getAuth 方法的模块默认有效
          modules.push(module)
        }
      }
    })
    return modules.sort((preItem, currentItem) => preItem.meta?.sort - currentItem.meta?.sort)
  }
} // 包含有效模块配置

window.wkGlobal = new WkGlobal()
Vue.prototype.wkGlobal = window.wkGlobal
